package yongxin.utils;

import java.io.*;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.LinkedList;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;

public class FileManager {   
    private ArrayList<File> lsFiles = new ArrayList<File>();   
    private static FileInputStream fis = null;   
    private static FileOutputStream fos = null;   
    /**  
     * list all files  
     * @param path  
     * @return ArrayList<File>  
     * @throws FileNotFoundException  
     */  
    public ArrayList<File> listAllFiles(String path) throws FileNotFoundException {   
        File file = new File(path);   
        File[] f = file.listFiles();   
        for(int i=0; i<f.length; i++) {   
           
            //If the current file is a directory, Recursion listed catalogue of the files   
            if(f[i].isDirectory()) {   
                listAllFiles(f[i].getAbsolutePath());   
            }   
            else{
            	 lsFiles.add(f[i]);   
            }
        }   
        return lsFiles;   
    }   
    /**  
     * copy srcFile to desFile  
     * @param srcFile  
     * @param desFile  
     * @throws FileNotFoundException  
     */  
    public static void copyFile(String srcFile, String desFile) throws FileNotFoundException, IOException {   
        fis = new FileInputStream(new File(srcFile));   
        fos = new FileOutputStream(new File(desFile));   
        byte[] buf = new byte[1024];   
        int len = 0;   
        while((len=fis.read(buf)) != -1) {   
            fos.write(buf, 0, len);   
        }   
        fos.close();   
        fis.close();   
    }   
    /**  
     * copy all files in srcFile to desFile  
     * @param srcFile  
     * @param desFile  
     * @throws FileNotFoundException  
     */  
    public void copyFiles(String srcFile, String desFile) throws FileNotFoundException, IOException {   
        ArrayList<File> lsFiles = listAllFiles(srcFile);   
        for(int i=0; i<lsFiles.size(); i++) {   
            File curFile = lsFiles.get(i);   
            if(curFile.isDirectory()) {   
                new File(desFile+curFile.getAbsolutePath().substring(srcFile.length())).mkdir();   
            } else {   
                copyFile(curFile.getAbsolutePath(), new File(desFile+curFile.getAbsolutePath().substring(srcFile.length())).getAbsolutePath());   
            }   
        }   
    }   
    /**  
     * Split a file into multiple files  
     * @param srcFile  
     * @param desDir   分割后文件存放的位置，是一个目录  
     * @param n  
     * @return  
     * @throws FileNotFoundException  
     */  
    public static File[] splitFile(String srcFile, String desDir, int part) throws FileNotFoundException, IOException {   
        File[] rsFile = new File[part];   
        File f = new File(srcFile);   
        long partLen = f.length()/part;     //part等分   
        int perLen = 2;   
        if(partLen > 1024) {   
            perLen = 512;   
        } else {   
            perLen = 2;   
        }   
        byte[] buf = new byte[perLen];   
        fis = new FileInputStream(f);   
        for(int i=0; i<part; i++) {   
            int pos = f.getName().lastIndexOf('.');   
            File partFile = new File(desDir+"/"+f.getName().substring(0, pos)+(i+1)+f.getName().substring(pos));   
            fos = new FileOutputStream(partFile);   
            rsFile[i] = partFile;   
            long m = partLen/perLen;   
            for(int j=0; j<m; j++) {   
                int len = 0;   
                if((len=fis.read(buf)) != -1) {   
                    fos.write(buf, 0, len);   
                }   
            }   
        }   
        //由于整除原因，可能导致最后一部分没有写入到文件中，因此需要补充下面内容   
        int nn= 0;   
        if((nn=fis.read(buf)) != -1) {   
            fos.write(buf, 0, nn);   
        }   
        fos.close();   
        fis.close();   
        return rsFile;   
    }   
    /**  
     * Combination of multiple files into one file  
     * @param srcFile  
     * @param desFile  
     * @return  
     * @throws FileNotFoundException  
     * @throws IOException  
     */  
    public static File mergeFile(File[] srcFile, String desFile) throws FileNotFoundException, IOException {   
        File rsFile = new File(desFile);   
        fos = new FileOutputStream(new File(desFile));   
        byte[] buf = new byte[1024];   
        int len = 0;   
        for(int i=0; i<srcFile.length; i++) {   
            fis = new FileInputStream(srcFile[i]);   
            while((len=fis.read(buf)) != -1) {   
                fos.write(buf, 0, len);   
            }   
            fis.close();   
        }   
        if(fos != null) {   
            fos.close();   
        }   
        if(fis != null) {   
            fis.close();               
        }   
        return rsFile;   
    }   
    /**  
     * delete a file  
     * @param srcFile  
     * @throws FileNotFoundException  
     * @throws IOException  
     */  
    public static void deleteFile(String srcFile) throws FileNotFoundException, IOException {   
        new File(srcFile).delete();   
    }   
    /**  
     * Delete all files in srcFile,This is too difficult for me  
     * @param srcFile  
     * @throws FileNotFoundException  
     * @throws IOException  
     */  
    public static void deleteFiles(String srcFile) throws FileNotFoundException, IOException {   
        LinkedList<File> dirs = new LinkedList<File>();    
        dirs.add(new File(srcFile));   
        while(dirs.size() > 0){   
            File currentDir = (File)dirs.getFirst();   
            File[] files = currentDir.listFiles();   
            boolean emptyDir = true;   
            for(int i = 0 ;i < files.length;i++) {   
                if (files[i].isFile()) {   
                    files[i].delete();   
                } else {   
                    dirs.addFirst(files[i]);   
                    emptyDir = false;   
                }   
            }   
            if (emptyDir){   
                currentDir.delete();   
                dirs.removeFirst();   
            }   
        }   
    }   
    /**  
     * move srcFile to desFile  
     * @param srcFile  
     * @param desFile  
     * @throws FileNotFoundException  
     */  
    public static void moveFile(String srcFile, String desFile) throws FileNotFoundException, IOException {   
        copyFile(srcFile, desFile);   
        new File(srcFile).delete();   
    }   
    /**  
     * move srcFile to desFile  
     * @param srcFile  
     * @param desFile  
     * @throws FileNotFoundException  
     */  
    public void moveFiles(String srcFile, String desFile) throws FileNotFoundException, IOException {   
        copyFiles(srcFile, desFile);   
        deleteFiles(srcFile);   
    }   
    /**  
     * compress files  
     * @param srcFile  
     * @param rarFile  
     * @throws FileNotFoundException  
     * @throws IOException  
     */  
    public static void compressFile(String _unZipFile, String _zipFile) throws FileNotFoundException, IOException {   
        File srcFile = new File(_unZipFile);   
        File zipFile = new File(_zipFile);   
        DataInputStream dis = new DataInputStream(new FileInputStream(srcFile));   
        if(!zipFile.exists()) {   
            File zipdir = new File(zipFile.getParent());   
            if(!zipdir.exists()) {   
                zipdir.mkdirs();   
            }   
            zipFile.createNewFile();   
        }   
        ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFile));   
        zos.setMethod(ZipOutputStream.DEFLATED);   
        ZipEntry ze = new ZipEntry(srcFile.getName());   
        zos.putNextEntry(ze);   
        DataOutputStream dos = new DataOutputStream(zos);   
           
        byte[] buf = new byte[2048];   
        int len=0;   
        while((len=dis.read(buf)) != -1) {   
            dos.write(buf, 0, len);   
        }   
        dos.close();   
        dis.close();   
    }   
    /**  
     * uncompress files  
     * @param rarFile  
     * @param srcFile  
     * @throws FileNotFoundException  
     * @throws IOException  
     */  
    @SuppressWarnings("unchecked")   
    public static void unCompressFile(String _zipFile, String _unZipDir) throws FileNotFoundException, IOException {   
        File unZipFile = new File("_unZipFile");   
        if(! unZipFile.exists()) {   
            unZipFile.mkdirs();   
        }   
        ZipEntry ze = null;   
        ZipFile zf = new ZipFile(new File(_zipFile));   
        Enumeration<ZipEntry> en = (Enumeration<ZipEntry>)zf.entries();   
        if(en.hasMoreElements()) {   
            ze = (ZipEntry)en.nextElement();   
        }   
        unZipFile = new File(_unZipDir+File.separator+ze.getName());   
        if(! unZipFile.exists()) {   
            unZipFile.createNewFile();   
        }   
        DataInputStream dis = new DataInputStream(zf.getInputStream(ze));   
        DataOutputStream dos = new DataOutputStream(new FileOutputStream(unZipFile));   
        int len = 0;   
        byte[] buf = new byte[2048];   
        while((len=dis.read(buf)) != -1) {   
            dos.write(buf, 0, len);   
        }   
        dos.close();   
        dis.close();   
    }   
    /**  
     *   
     * @param args  
     */  
    public static void main(String[] args) throws FileNotFoundException, IOException {   
        //          ArrayList<File> lsFiles = listAllFiles("D:/temp");   
        //          for(int i=0; i<lsFiles.size(); i++) {   
        //              System.out.println(lsFiles.get(i).getPath());   
        //          }   
        //          System.out.println(lsFiles.size());   
        //          //copyFile("D:/temp/我的桌面.jpg","D:/temp/test.jpg");   
        //          try {   
        //              copyFiles("D:/temp","D:/tt");   
        //          } catch (IOException e) {   
        //              // TODO Auto-generated catch block   
        //              e.printStackTrace();   
        //          }   
        //          //moveFile("D:/temp/我的桌面.jpg","D:/temp/test.jpg");   
                    //moveFiles("D:/ttt","D:/temp");   
        //          File f = new File("D:/temp/软件0820   9308036    .王颜涛.doc");   
        //          System.out.println(f.getName());   
//      try {   
//          splitFile("D:/temp/tttt.rar", "D:/temp/test", 3);   
//      } catch (IOException e) {   
//          e.printStackTrace();   
//      }   
//      File[] f = {new File("D:/temp/test/tttt1.rar"), new File("D:/temp/test/tttt2.rar"), new File("D:/temp/test/tttt3.rar")};   
//      try {   
//          mergeFile(f, "D:/temp/test.rar");   
//      } catch (IOException e) {   
//          // TODO Auto-generated catch block   
//          e.printStackTrace();   
//      }   
        //deleteFiles("D:/temp/tttt");         
        compressFile("D:/temp/bb.pdf","D:/temp/bb.rar");   
        //unCompressFile("D:/temp/test.rar","D:/temp/test2");   
    }   
}  